package cn.bugstack.gateway.session;

import cn.bugstack.gateway.session.handler.SessionServerHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpRequestDecoder;
import io.netty.handler.codec.http.HttpResponseEncoder;


/**
 * SessionChannelInitializer
 * 该类继承自 Netty 的 ChannelInitializer，用于在客户端与服务器建立连接时，
 * 初始化通道（Channel）所需的处理器（Handler）流水线（Pipeline）。
 * 主要职责：
 * - 在新的 SocketChannel 创建时，为其添加编解码器、聚合器和业务处理器；
 * - 确保 HTTP 请求在 Netty 中能被正确解析与响应；
 * - 提供后续 Session 服务器的业务逻辑处理入口。
 * 使用场景：
 * - 通常在 Netty 服务器启动时由 ServerBootstrap 调用，用于设置子通道的处理逻辑。
 * 作者：陈佳
 * 日期：2025-10-26
 * @author chenjia
 */
public class SessionChannelInitializer extends ChannelInitializer<SocketChannel> {

    /**
     * 初始化通道的方法。
     * 该方法在每当有新的客户端连接（SocketChannel）被接受时自动调用，
     * 用于配置该通道的处理流水线（Pipeline），包括 HTTP 协议的编解码、
     * 消息聚合及业务逻辑处理器。
     * @param channel 新建立的客户端 Socket 通道
     * @throws Exception 初始化过程中出现的异常
     */
    @Override
    protected void initChannel(SocketChannel channel) throws Exception {
        // 获取当前通道的流水线（Pipeline）
        ChannelPipeline line = channel.pipeline();

        // 添加 HTTP 请求解码器：将字节流解析为 HTTP 请求对象
        line.addLast(new HttpRequestDecoder());

        // 添加 HTTP 响应编码器：将服务器响应对象编码为字节流返回给客户端
        line.addLast(new HttpResponseEncoder());

        // 添加 HTTP 聚合器：将多个 HTTP 消息片段组合成一个完整的 FullHttpRequest 或 FullHttpResponse
        // 通常用于支持 POST 请求体和大数据传输
        line.addLast(new HttpObjectAggregator(1024 * 1024));

        // 添加自定义的 Session 业务逻辑处理器，用于处理具体的请求和响应逻辑
        line.addLast(new SessionServerHandler());
    }
}

